package model.algorithmes;

import model.value.VersionnedValue;

import model.observer.SensorObserver;
import model.subject.Sensor;

/**
 * Implémentation de l'interface SpreadingAlgorithme, pour une diffusion atomique des valeurs. Ici, il s'agit de garder une copie de la valeur à diffuser, de
 * façon à ce que tous les observeurs voient systématiquement la même valeur, sans pour autant empêcher la modification de cette valeur. Aussi, les observeurs 
 * ne verront pas nécessairement toutes les valeurs prises par la capteur.
 */
public class SequentialSpreadingImpl implements SpreadingAlgorithme {

	private VersionnedValue currentValue;
	private VersionnedValue currentValueCopy;

	private Sensor sensor;
	private int count;	// Nombre de diffusions en cours

	@Override
	public void configure(Sensor sensor) {
		this.sensor = sensor;

		count = 0;
	}

	@Override
	public VersionnedValue getValue() {
		if(count > 0) {
			count--;
		}
		
		return currentValueCopy;
	}

	@Override
	public void execute() {
		currentValue = sensor.getRealValue();
		
		if(count == 0) {	// Si il n'y a pas de diffusion en cours alors on fait une copie de la valeur à diffuser
			currentValueCopy = currentValue.copy();
			
			for(SensorObserver observer : sensor.getObservers()) {
				observer.update(sensor);
				count++;
			}
		}
	}

	@Override
	public void setValue(int value) {
		sensor.setRealValue(value);
	}

}
